package main

import (
	"fmt"
	"math"
)

//包内
//var aa = 3
//var ss = "kkk"
//bb :=false 函数外面不可以使用 :=
var (
	aa = 3
	ss = "kkk"
	bb = true
)

func variableZeroValue() {
	//变量 默认初始化为0
	var a int
	var s string
	fmt.Printf("%d %q", a, s)
}

func variableInitialValue() {
	var a, b int = 3, 4
	var s string = "abc"
	fmt.Println(a, b, s)
}

func variableTypeDeduction() {
	var a, b, c, d = 1, 2, true, "string"
	fmt.Println(a, b, c, d)
}

func variableShorter() {
	a, b, c, d := 1, 2, true, "string"
	fmt.Println(a, b, c, d)
}

func variableShorter2() {
	a, b, c, d := 1, 2, true, "string"
	fmt.Println(a, b, c, d)
}

/*
	bool string
	(u)int (u)int8 (u)int16 (u)int32 (u)int64 uintptr
	(u)int 大小有操作系统决定32 4 64 8
	complex64 complex128 实部虚部都是float 要么float32 float64
	注意浮点数 不准确 都有有效小树位数
 */

const filename = "abc.txt"

func consts() {
	/*
		const value [type]=
		当常量不设置类型的时候,既可以做int 也可做其他类型
		即常量的类型可以做为各种类型来使用
		const a,b = 3,4
		var c int = a+b
		var d float32 = a+b
		不用强制转换
		const(
			filename = "abc.txt"
			a,b = 3,4
		)
	 */
	const a, b = 3, 4
	var c int = int(math.Sqrt(a*a + b*b))
	fmt.Println(a, b, c, filename)
}

func enums() {
	//常量定义了可以不使用,且用iota复制时,后面的变量从0递增
	const (
		cpp    = iota
		_       //'_'代表匿名变量
		java
		python
		golang
	)

	const (
		b  = 1 << (10 * iota)
		kb
		mb
		gb
		tb
		pb
	)
	fmt.Println(cpp, java, python)
	fmt.Println(b, kb, mb, tb, gb, pb)
}

func main() {
	variableZeroValue()
	variableInitialValue()
	variableTypeDeduction()
	variableShorter()
	fmt.Println(aa, ss, bb)
	consts()
	enums()
}
